#pragma once

#include "../gui_export.hpp"

// 定义应用程序主函数和退出函数的函数指针类型
typedef void (*app_main_t)(void*);
typedef void (*app_exit_t)(void*);



// App类，表示一个应用程序
class App
{
public:
  // 构造函数，初始化应用程序的名称、主函数、退出函数、图标和背景颜色
  App(const char* name, app_main_t main, app_exit_t exit, const void* icon, lv_color_t bg_color);
  ~App();
  std::string* get_name();    // 获取应用程序名称
  void* get_icon();           // 获取应用程序图标
  lv_color_t get_bg_color();  // 获取应用程序背景颜色
  void run(void*);            // 运行应用程序
private:
  std::string* name = NULL;   // 应用程序名称
  app_main_t app_main = NULL; // 应用程序主函数指针
  app_exit_t app_exit = NULL; // 应用程序退出函数指针
  void* icon;                 // 应用程序图标
  lv_color_t bg_color;        // 应用程序背景颜色
};


// AppManger类，用于管理多个应用程序
class AppManger
{
private:
  /* data */

  Page* main_page = NULL;           // 主页面指针
  std::list<App*> app_list;         // 应用程序列表
public:
  AppManger();
  ~AppManger();
  // 安装一个新的应用程序
  void install(const char* name, app_main_t main, app_exit_t exit, const void* icon, lv_color_t bg_color);
  void app_exit();                  // 退出当前应用程序
  void add_main_page(Page* page);   // 添加主页面
  std::list<App*> get_app_list();   // 获取应用程序列表
  void load_app(char* name);        // 加载指定名称的应用程序
};


extern AppManger app_manger;


